"""
视频播放窗口 - 用于音画同步功能
"""
import os
from PyQt5.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QLabel
from PyQt5.QtCore import Qt, pyqtSignal, QUrl
from PyQt5.QtGui import QColor, QPalette, QBrush, QPainter
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtMultimediaWidgets import QVideoWidget

from app.utils.logger import Logger


class GreenVideoWidget(QVideoWidget):
    """
    自定义绿色背景的视频部件
    """
    def __init__(self, parent=None):
        super().__init__(parent)
        # 设置绿色背景
        self.setAutoFillBackground(True)
        palette = self.palette()
        palette.setColor(QPalette.Window, QColor(0, 255, 0))
        self.setPalette(palette)
    
    def paintEvent(self, event):
        """
        重写绘制事件，确保在没有视频时显示绿色背景
        """
        super().paintEvent(event)
        # 如果没有视频内容，绘制绿色背景
        if not self.videoAvailable():
            painter = QPainter(self)
            painter.fillRect(self.rect(), QColor(0, 255, 0))


class VideoPlayerWindow(QMainWindow):
    """
    视频播放窗口类 - 用于音画同步功能
    
    一个简单的视频播放窗口，背景为绿色，支持拖拽播放视频，没有控制按钮
    """
    
    # 定义信号
    video_dropped = pyqtSignal(str)  # 视频文件拖放信号
    
    def __init__(self, parent=None):
        """
        初始化视频播放窗口
        
        @param parent: 父窗口
        """
        super().__init__(parent)
        
        # 获取日志记录器
        self.logger = Logger.get_logger("video_player_window")
        
        # 设置窗口属性
        self.setWindowTitle("音画同步")
        
        # 设置窗口比例为9:16（手机尺寸）
        width = 360  # 手机宽度
        height = 640  # 手机高度 (9:16比例)
        self.resize(width, height)
        
        # 禁用关闭按钮
        self.setWindowFlag(Qt.WindowCloseButtonHint, False)
        
        self.setAcceptDrops(True)  # 允许拖放
        
        # 默认背景颜色为绿色
        self.background_color = QColor(0, 255, 0)
        
        # 设置窗口背景色为绿色
        self.setAutoFillBackground(True)
        palette = self.palette()
        palette.setColor(QPalette.Window, self.background_color)
        self.setPalette(palette)
        
        # 初始化UI
        self._init_ui()
        
        # 初始化媒体播放器
        self._init_media_player()
        
        self.logger.info("视频播放窗口初始化完成")
    
    def set_background_color(self, color):
        """
        设置背景颜色
        
        @param color: QColor对象，表示背景颜色
        """
        self.background_color = color
        
        # 更新窗口背景色
        palette = self.palette()
        palette.setColor(QPalette.Window, color)
        self.setPalette(palette)
        
        # 更新中央部件背景色
        palette = self.central_widget.palette()
        palette.setColor(QPalette.Window, color)
        self.central_widget.setPalette(palette)
        
        # 更新背景标签背景色
        self.background_label.setStyleSheet(f"background-color: rgb({color.red()}, {color.green()}, {color.blue()});")
        
        # 更新视频部件背景色
        palette = self.video_widget.palette()
        palette.setColor(QPalette.Window, color)
        self.video_widget.setPalette(palette)
        
        self.logger.info(f"背景颜色已更新为: RGB({color.red()}, {color.green()}, {color.blue()})")
    
    def _init_ui(self):
        """
        初始化UI
        """
        # 创建中央部件
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        
        # 设置中央部件背景色
        self.central_widget.setAutoFillBackground(True)
        palette = self.central_widget.palette()
        palette.setColor(QPalette.Window, self.background_color)
        self.central_widget.setPalette(palette)
        
        # 创建主布局
        self.main_layout = QVBoxLayout(self.central_widget)
        self.main_layout.setContentsMargins(0, 0, 0, 0)
        self.main_layout.setSpacing(0)
        
        # 创建绿色背景标签（作为底层）
        self.background_label = QLabel()
        self.background_label.setStyleSheet(f"background-color: rgb({self.background_color.red()}, {self.background_color.green()}, {self.background_color.blue()});")
        self.background_label.setAlignment(Qt.AlignCenter)
        
        # 创建视频部件
        self.video_widget = QVideoWidget()
        
        # 设置视频部件背景色
        self.video_widget.setAutoFillBackground(True)
        palette = self.video_widget.palette()
        palette.setColor(QPalette.Window, self.background_color)
        self.video_widget.setPalette(palette)
        
        # 添加背景标签和视频部件到布局
        self.main_layout.addWidget(self.background_label)
        self.main_layout.addWidget(self.video_widget)
        
        # 确保视频部件填满整个窗口
        self.video_widget.setAspectRatioMode(Qt.IgnoreAspectRatio)
        
        # 设置视频部件在最上层
        self.video_widget.raise_()
    
    def _init_media_player(self):
        """
        初始化媒体播放器
        """
        self.media_player = QMediaPlayer(self)
        self.media_player.setVideoOutput(self.video_widget)
        
        # 连接媒体播放器信号
        self.media_player.mediaStatusChanged.connect(self._on_media_status_changed)
        self.media_player.error.connect(self._on_error)
        self.media_player.stateChanged.connect(self._on_state_changed)
        
        # 初始状态下确保视频部件是隐藏的，只显示绿色背景
        self.video_widget.hide()
        self.background_label.show()
    
    def play_video(self, video_path):
        """
        播放视频
        
        @param video_path: 视频文件路径
        """
        if not video_path:
            self.logger.warning("视频路径为空，无法播放")
            return
        
        try:
            # 检查文件是否存在
            if not os.path.exists(video_path):
                self.logger.error(f"视频文件不存在: {video_path}")
                return
            
            # 设置媒体内容
            media_content = QMediaContent(QUrl.fromLocalFile(video_path))
            self.media_player.setMedia(media_content)
            
            # 显示视频部件，隐藏背景标签
            self.video_widget.show()
            self.background_label.hide()
            
            # 播放视频
            self.media_player.play()
            
            self.logger.info(f"开始播放视频: {video_path}")
            
        except Exception as e:
            self.logger.error(f"播放视频失败: {str(e)}")
            # 出错时显示绿色背景
            self.video_widget.hide()
            self.background_label.show()
    
    def stop_video(self):
        """
        停止播放视频
        """
        self.media_player.stop()
        # 停止视频时显示绿色背景
        self.video_widget.hide()
        self.background_label.show()
        self.logger.info("停止播放视频")
    
    def _on_media_status_changed(self, status):
        """
        处理媒体状态变化
        
        @param status: 媒体状态
        """
        if status == QMediaPlayer.EndOfMedia:
            # 视频播放结束时显示绿色背景
            self.video_widget.hide()
            self.background_label.show()
            self.logger.info("视频播放结束")
    
    def _on_error(self, error):
        """
        处理媒体播放器错误
        
        @param error: 错误代码
        """
        # 出错时显示绿色背景
        self.video_widget.hide()
        self.background_label.show()
        self.logger.error(f"媒体播放器错误: {error}, {self.media_player.errorString()}")
    
    def _on_state_changed(self, state):
        """
        处理播放状态变化
        
        @param state: 播放状态
        """
        if state == QMediaPlayer.StoppedState:
            # 视频停止播放时显示绿色背景
            self.video_widget.hide()
            self.background_label.show()
            self.logger.info("视频停止播放，恢复绿色背景")
        elif state == QMediaPlayer.PlayingState:
            # 视频播放时显示视频部件
            self.video_widget.show()
            self.background_label.hide()
            self.logger.info("视频开始播放")
    
    def dragEnterEvent(self, event):
        """
        处理拖拽进入事件
        
        @param event: 拖拽事件
        """
        # 只接受文件拖拽
        if event.mimeData().hasUrls():
            event.acceptProposedAction()
    
    def dropEvent(self, event):
        """
        处理拖拽放下事件
        
        @param event: 拖拽事件
        """
        # 获取拖拽的文件路径
        for url in event.mimeData().urls():
            file_path = url.toLocalFile()
            # 检查是否是视频文件
            if self._is_video_file(file_path):
                self.logger.info(f"拖放视频文件: {file_path}")
                self.play_video(file_path)
                self.video_dropped.emit(file_path)
                break
        
        event.acceptProposedAction()
    
    def _is_video_file(self, file_path):
        """
        检查文件是否是视频文件
        
        @param file_path: 文件路径
        @return: 是否是视频文件
        """
        video_extensions = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv']
        _, ext = os.path.splitext(file_path.lower())
        return ext in video_extensions
    
    def closeEvent(self, event):
        """
        处理窗口关闭事件 - 忽略关闭事件，只能通过主窗口关闭
        
        @param event: 关闭事件
        """
        # 忽略关闭事件，防止用户通过窗口关闭按钮关闭窗口
        event.ignore()
        self.logger.info("忽略窗口关闭事件，窗口只能通过主窗口关闭") 